{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "千帆提供了 Prompt 管理功能，可以快速地使用平台预置的优质 Prompt，或者保存用户自定义的 Prompt。SDK 也为用户快速使用 Prompt 提供了辅助。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prompt 相关功能需要使用 Access Key 和 Secret Key 进行鉴权，获取方式参见 [文档](https://cloud.baidu.com/doc/Reference/s/9jwvz2egb)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import qianfan\n",
    "\n",
    "os.environ[\"QIANFAN_ACCESS_KEY\"] = \"your access key\"\n",
    "os.environ[\"QIANFAN_SECRET_KEY\"] = \"your secret key\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以通过这一方式导入 Prompt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qianfan.common import Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 快速使用"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "平台上预置的 Prompt 以及用户自定义的模型都可以在 [千帆控制台](https://console.bce.baidu.com/qianfan/prompt/template) 获得，之后可以在 SDK 中用 Prompt 的名称快速获取 Prompt 对象。\n",
    "\n",
    "加载平台上的相关资源需要使用 hub 功能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qianfan.common.hub import hub\n",
    "\n",
    "p = hub.load(\"prompt/区域美食推荐\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "之后就可以调用 `render` 方法对 Prompt 模版进行填充，得到最终的文本。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "作为游客，告诉我上海必吃的10大美食\n"
     ]
    }
   ],
   "source": [
    "# 第二个参数是 negative prompt，文生文场景下为空，所以用 _ 省略\n",
    "prompt, _ = p.render(region=\"上海\")\n",
    "print(prompt)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "也可以通过如下方式获得 Prompt 的一些元信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "作为游客，告诉我{region}必吃的10大美食\n",
      "['region']\n"
     ]
    }
   ],
   "source": [
    "print(p.template)\n",
    "print(p.variables)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SDK 也支持文生图类型的 Prompt，可以通过文生图类的 Prompt 名称进行初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "white hair female, close up character design, multiple concept designs, concept design sheet, white background, style of Yoshitaka Amano\n",
      "(worst quality, low quality:1.4), deformed iris, deformed pupils, (deformeddistorted, disfigured:1.3), cropped, out of frame.poorly drawn, bad anatomy, wrong anatomy, extralimb, missing limb, floating limbs\n"
     ]
    }
   ],
   "source": [
    "txt2img_prompt = hub.load(\"prompt/角色设计\")\n",
    "\n",
    "prompt, negative_prompt = txt2img_prompt.render()\n",
    "print(prompt)\n",
    "print(negative_prompt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prompt 的场景可以通过 `scene_type` 属性获得"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from qianfan.consts import PromptSceneType\n",
    "\n",
    "txt2img_prompt.scene_type == PromptSceneType.Text2Image"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "借助 Prompt，我们就可以快速地完成一些任务，比如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "作为游客，上海必吃的十大美食包括：\n",
      "\n",
      "1. **生煎馒头**：上海特色早餐，鲜肉馅，底部脆硬，整体味道鲜美。\n",
      "2. **小笼包**：上海的小笼包以汤汁丰足、味道醇正著称。\n",
      "3. **蟹壳黄**：上海本地特色小吃，以烤至酥脆的饼皮和咸蛋黄肉馅为主。\n",
      "4. **白斩鸡**：最原汁原味的上海白斩鸡搭配甜酱是最佳的选择。\n",
      "5. **糖醋排骨**：使用传统的糖醋工艺制作的上海特色菜肴，酸甜可口。\n",
      "6. **炸猪排**：与排骨相似的上海特色小吃，通常与番茄酱一起食用。\n",
      "7. **清炒虾仁**：上海的传统名菜，口感鲜美，营养丰富。\n",
      "8. **响油鳝糊**：上海本地的特色鳝鱼美食，味道鲜美，做法相对复杂。\n",
      "9. **三鲜馄饨**：上海的传统小吃，以鲜肉、虾仁和海鲜为主要馅料，味道鲜美。\n",
      "10. **糟卤**：一种特殊的调味料，可以增加食物的鲜美程度，尤其适合海鲜类食品。\n",
      "\n",
      "以上十种美食涵盖了甜、咸、酥、脆、鲜等多种口感，可以满足不同游客的口味。在品尝美食的同时，也可以搭配上海本地的茶点，体验上海的饮食文化。\n"
     ]
    }
   ],
   "source": [
    "import qianfan\n",
    "\n",
    "p = hub.load(\"prompt/区域美食推荐\")\n",
    "\n",
    "def recommend_food(region):\n",
    "    prompt, _ = p.render(region=region)\n",
    "    r = qianfan.Completion().do(prompt)\n",
    "    return r['result']\n",
    "\n",
    "print(recommend_food(\"上海\"))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 本地 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果不希望使用平台上的模型，只希望本地尝试，也可以通过 Prompt 对象实现，初始化时仅传入 `template` 字段即可。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "本地 prompt hello\n"
     ]
    }
   ],
   "source": [
    "p = Prompt(\"本地 prompt {var1}\")\n",
    "\n",
    "prompt, _ = p.render(var1=\"hello\")\n",
    "print(prompt)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "还可以传入更多参数，创建一个更为复杂的本地 Prompt，比如下面创造了一个场景为文生图的 Prompt，并且给定了分别设置了正向和负向 Prompt，并且采用 `(())` 作为标识符。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "prompt = Prompt(\n",
    "    name=\"txt2img\",\n",
    "    template=\"txt2img template ((v1))\",\n",
    "    scene_type=PromptSceneType.Text2Image,\n",
    "    negative_template=\"negative template ((v3))\",\n",
    "    identifier=\"(())\",\n",
    ")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 上传/更新 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于本地 Prompt，还可以使用 hub 将其上传保存至平台，方便后续快速使用，上传仅需要利用 `hub.push` 即可。关于 hub 的一些其他操作，可以参考 hub 的相关文档。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = Prompt(\n",
    "    template=\"本地 prompt {var1}\",\n",
    "    # 对于平台上的 prompt 来说，name 是必须的，因此上传前必须先设置\n",
    "    name=\"cookbook_prompt\"\n",
    ")\n",
    "\n",
    "# 也可以通过这种方式设置 name\n",
    "p.name = \"cookbook_prompt\"\n",
    "hub.push(p)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "后续还可以本地对 Prompt 进行更新，并继续用 `hub.push` 方法更新至平台上。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['new_var']\n",
      "('新的 Prompt hello', None)\n"
     ]
    }
   ],
   "source": [
    "p.set_template(\"新的 Prompt {new_var}\")\n",
    "hub.push(p)\n",
    "\n",
    "print(p.variables)\n",
    "print(p.render(new_var=\"hello\"))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 删除 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SDK 提供了 `delete` 方法，可以快速删除平台上的 Prompt。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = hub.load(\"prompt/cookbook_prompt\")\n",
    "p.delete()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果没有抛出异常，那么这条 Prompt 已经从平台上移除。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存/读取 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通常在进行 Prompt 调优后，需要保存 Prompt 以便后续使用，SDK 也提供了 `save_to_file` 方法，可以将 Prompt 保存保存至本地。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "p = Prompt(template=\"这是一个用于{usage}的 Prompt\")\n",
    "p.save_to_file(\"test_prompt.tpl\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而在再次使用时，只需要通过 `from_file` 方法即可读取 Prompt。\n",
    "\n",
    "如果希望调整 Prompt，可以直接对模版文件修改，从而既可以避免在代码中出现冗长的模版字符串，也可以因调整模版而反复修改代码。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "这是一个用于测试的 Prompt\n"
     ]
    }
   ],
   "source": [
    "p = Prompt.from_file(\"test_prompt.tpl\")\n",
    "prompt, _ = p.render(usage=\"测试\")\n",
    "print(prompt)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 优化 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了能够提升模型的生成效果，SDK 提供了优化 prompt 的功能，能够快速生成高质量的 prompt。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请撰写一份{job}的年终报告，包括该{job}的概要、成绩和挑衅。请在报告中提供{job}的详细说明和目标，并阐明{job}的成果和挑战。同时，请提供相关数据和指标，以证明{job}的有效性和可操作性。请注意，您的报告应该简洁明了，并包含所有必要的细节和信息，以帮助读者更好地理解{job}的表现和结果。\n"
     ]
    }
   ],
   "source": [
    "old_prompt = Prompt(\"帮我写一份{job}的年终报告\")\n",
    "new_prompt = old_prompt.optimize()\n",
    "print(new_prompt.template)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "优化可以开启不同选项：\n",
    "\n",
    "- `optimize_quality`：优化 prompt 质量\n",
    "- `simplify_prompt`：简化 prompt，可以省去“的”、“吧”等含义不强的文本实体，精炼语料内容并降低推理成本\n",
    "- `iteration_round`：优化迭代轮数，默认为 1\n",
    "- `enable_cot`：开启思维链，将指引模型拆解Prompt内容，逐步进行推理。建议仅在数学计算、逻辑推理等场景下开启使用。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估 Prompt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在优化完 Prompt 后，SDK 提供了 `evaluate` 方法，可以快速评估不同 Prompt 的质量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qianfan import Completion\n",
    "\n",
    "prompts = [old_prompt, new_prompt]\n",
    "scenes = [\n",
    "    {\n",
    "        \"args\": {\"job\": \"程序员\"},\n",
    "        \"expected\": \"代码\"\n",
    "    },\n",
    "    {\n",
    "        \"args\": {\"job\": \"产品经理\"},\n",
    "        \"expected\": \"用户量\"\n",
    "    }\n",
    "]\n",
    "model = Completion()\n",
    "\n",
    "results = Prompt.evaluate(prompts, scenes, model)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "results 是一个 list，每个元素是一个 PromptEvaluateResult 对象，代表一个 Prompt 的评估结果。可以用 summary 字段获取评估总结。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "程序员\n",
      "【用户期望结果】：\n",
      "\n",
      "1. 清晰明确的提示词：用户需要一个简洁、明确的提示词，以便快速理解需要完成的任务。\n",
      "2. 具体性：用户期望提示词能够提供足够的具体信息，以便生成符合要求的年终报告。\n",
      "3. 通用性：用户希望提示词具有一定的通用性，以便能够适应不同的工作场景和需求。\n",
      "\n",
      "【模型生成结果】：\n",
      "\n",
      "1. 清晰明确：提示词“帮我写一份{job}的年终报告”简洁明了，用户可以快速理解需要完成的任务。\n",
      "2. 具体性：该提示词提供了“job”这一关键词，用户可以根据自己的实际工作情况填写具体的职业或岗位名称，使得生成的年终报告更具针对性。\n",
      "3. 通用性：该提示词中的“{job}”是一个占位符，可以根据不同的工作场景和需求进行替换，具有一定的通用性。\n",
      "\n",
      "【评价】：\n",
      "\n",
      "该提示词模版撰写得相对较好，既简洁明了，又具有一定的具体性和通用性，能够满足用户的需求。如果一定要对模版进行改进，可以考虑增加一些细节方面的提示，例如在“年终报告”前加上“工作总结”等关键词，以更好地引导用户生成符合要求的年终报告。\n",
      "======\n",
      "产品经理\n",
      "根据您提供的模板，以下是对提示词模版撰写质量的评价：\n",
      "\n",
      "1. 清晰度：模版使用了简洁明了的语言，使得用户可以快速理解要求的内容和格式。每个部分都有明确的标题，如“概要”、“成绩”和“挑衅”，这有助于用户组织思路和信息。\n",
      "2. 适应性：模版使用了灵活的占位符，如“{job}”，使得该模版可以适用于多种不同的职位和场景。通过替换占位符，用户可以轻松地生成特定于其职位的年终报告。\n",
      "3. 完整性：模版要求包含所有必要的部分，如“概要”、“成绩”和“挑衅”，以确保报告的全面性。这有助于用户在撰写报告时不会遗漏任何重要信息。\n",
      "4. 数据和指标要求：模版强调了提供相关数据和指标的重要性，这有助于证明该职位的有效性和可操作性。这是年终报告中一个非常关键的部分，因为它为读者提供了具体的信息，以评估该职位的成果和挑战。\n",
      "5. 简洁性：模版提醒用户报告应该简洁明了，这有助于确保报告易于阅读和理解。在撰写报告时，避免冗余和不必要的细节是非常重要的，模版的这一要求有助于实现这一目标。\n",
      "\n",
      "综上所述，该提示词模版撰写质量较高，能够为用户提供清晰、完整和实用的指导，以确保他们能够生成一份出色的年终报告。\n",
      "======\n"
     ]
    }
   ],
   "source": [
    "for scene, result in zip(scenes, results):\n",
    "    print(scene[\"args\"][\"job\"])\n",
    "    print(result.summary)\n",
    "    print(\"======\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同时也可以通过 scene 字段，获取不同场景下每个 prompt 评估分数与模型输出。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预期输出： 代码\n",
      "评价得分： 0.6875922409817495\n",
      "模型输出： 年度工作总结与展望\n",
      "\n",
      "尊敬的领导和各位同事：\n",
      "\n",
      "我是XXX，一名普通的程序员，很荣幸在这里向大家汇报我今年的工作情况。\n",
      "\n",
      "一、个人概要\n",
      "\n",
      "我从事软件开发工作已有X年，对各种编程语言如Python、Java等有着深厚的功底，同时对数据结构和算法有深入的理解。我的目标是不断提升自己的技术水平，为公司的业务发展提供强有力的支持。\n",
      "\n",
      "二、成绩和挑衅\n",
      "\n",
      "今年，我参与了多个项目的开发，其中最值得一提的是我们团队成功完成了“XX系统”的升级工作。在这个项目中，我负责了核心部分的编程和优化，通过改进算法和提升效率，我们成功地为客户系统带来了20%的性能提升，得到了客户和领导的高度赞扬。\n",
      "\n",
      "然而，我也面临着一些挑战。一方面，随着技术的快速发展，我需要不断学习新的知识和技能，以应对不断变化的开发环境；另一方面，我注意到团队中一些成员对复杂技术的接受程度有限，这在一定程度上制约了我们项目的进展。为此，我感到有必要提升自己的教学和传播能力，以便更好地帮助团队成员提升技术水平。\n",
      "\n",
      "三、程序员的详细说明和目标\n",
      "\n",
      "1. 编程语言和工具：我主要使用Python和Java进行开发，工具包括Git、Jira等项目管理工具，以及各种数据库和云服务。\n",
      "2. 技能提升：今年我特别关注了人工智能和机器学习的相关知识，希望能将这些技术应用到我们的项目中。同时，我也提高了我的英语阅读能力，以便更好地获取国际前沿的技术信息。\n",
      "3. 目标：我希望在明年能够带领我们的团队完成更多的高质量项目，同时提升我们的技术教学能力，帮助更多的团队成员提升技术水平。\n",
      "\n",
      "四、成果和挑战\n",
      "\n",
      "今年，我们团队取得了丰硕的成果。我们参与的多个项目都得到了客户的满意反馈，其中“XX系统”的升级项目更是我们的亮点。我们的代码质量得到了显著提升，错误率下降了30%，这大大提高了我们项目的成功率。\n",
      "\n",
      "然而，我们也面临一些挑战。首先，随着业务的发展，我们的项目数量和复杂度都在增加，这给我们团队带来了很大的工作压力。其次，尽管我们在代码质量和效率上有了一定的提升，但在某些特殊场景下的性能优化仍然是我们需要解决的问题。最后，如何培养和提升团队成员的技术能力也是一个我们需要面对的挑战。\n",
      "\n",
      "五、数据和指标\n",
      "\n",
      "为了证明我们团队的有效性和可操作性，我附上了一些相关的数据和指标：\n",
      "\n",
      "1. 项目成功率：今年我们参与的多个项目中，有85%的项目得到了客户的满意反馈，我们认为这是由于我们在代码质量和效率上的提升。\n",
      "2. 错误率：今年我们的代码错误率相比去年下降了30%，这表明我们的编程质量和效率得到了显著提升。\n",
      "3. 学习资源：我们团队非常重视学习新的技术和知识。今年我们阅读了大量的英文技术文章和书籍，参加了多个线上和线下的技术研讨会。这些学习资源有助于我们跟上技术的发展步伐。\n",
      "\n",
      "以上就是我的年终报告，感谢大家在一年中的支持和帮助。在未来的工作中，我们会继续努力，为公司的业务发展做出更大的贡献。谢谢大家！\n",
      "======\n",
      "预期输出： 用户量\n",
      "评价得分： 0.6793301118887888\n",
      "模型输出： 产品经理年终报告\n",
      "\n",
      "尊敬的领导：\n",
      "\n",
      "我是XXX公司XXX产品经理，在这一年中，我带领团队成功完成了XXX产品的发展、设计、开发、测试和上线工作。以下是我在这一年的工作总结和成果分析，以及对未来挑战的展望。\n",
      "\n",
      "一、产品经理概要\n",
      "\n",
      "姓名：XXX\n",
      "职位：XXX产品经理\n",
      "公司：XXX公司\n",
      "产品名称：XXX产品\n",
      "任职时间：自XXXX年XX月开始\n",
      "\n",
      "二、成绩和挑衅\n",
      "\n",
      "1.成绩\n",
      "\n",
      "（1）产品成功上线：我们成功推出了XXX产品，并获得了广大用户的积极反馈。产品上线以来，用户量持续增长，市场表现良好。\n",
      "（2）团队协作高效：我与研发、设计、市场等部门的紧密合作，保证了项目的顺利进行。在团队的共同努力下，我们的产品开发周期比原计划缩短了20%。\n",
      "（3）用户反馈积极：通过对用户的调研和反馈进行分析，我们不断优化产品功能，提升用户体验。目前，我们的产品满意度高达90%。\n",
      "\n",
      "2.挑战\n",
      "\n",
      "（1）竞争激烈：尽管我们的产品表现良好，但市场上同类竞品层出不穷，这给我们的产品带来了巨大的竞争压力。\n",
      "（2）用户需求变化快：随着市场的变化，用户对产品的需求也在不断变化。我们需要及时调整产品策略，以满足用户的新需求。\n",
      "（3）技术难题：在产品开发过程中，我们遇到了一些技术难题，如数据安全、性能优化等。这些问题需要我们投入更多的资源和时间来解决。\n",
      "\n",
      "三、产品经理目标和成果\n",
      "\n",
      "1.目标\n",
      "\n",
      "（1）提升用户满意度：通过优化产品功能，提升用户体验，我们将努力将用户满意度提高到95%。\n",
      "（2）扩大市场份额：我们将加大市场推广力度，提高产品的知名度和市场占有率。\n",
      "（3）优化技术架构：解决技术难题，提高产品的稳定性和性能，为未来的产品升级打下基础。\n",
      "\n",
      "四、相关数据和指标\n",
      "\n",
      "1.用户增长：产品上线以来，用户数量增长了50%，日活跃用户占比达到了40%。\n",
      "2.市场反馈：在各大应用商店中，我们的产品评分达到了4.5分（满分5分）。\n",
      "3.竞品分析：对市场上同类竞品进行深入分析，了解其优缺点和营销策略。\n",
      "4.技术指标：通过各项性能测试和安全评估，我们的产品达到了预期的技术指标。\n",
      "\n",
      "五、有效性及可操作性验证\n",
      "\n",
      "通过数据分析和市场反馈，我们的产品在市场上表现良好，用户满意度高，市场反响热烈。同时，我们的团队成员也表示，在产品开发过程中，他们的工作效率得到了提高，团队协作更加顺畅。这些数据和反馈都验证了我们在产品管理方面的有效性和可操作性。\n",
      "\n",
      "六、未来展望\n",
      "\n",
      "尽管我们在过去一年中取得了不错的成绩，但面临的挑战仍然不小。我们将继续努力，争取在竞争激烈的市场中取得更大的成功。具体来说，我们将：\n",
      "\n",
      "（1）加强用户需求调研，及时调整产品策略，以满足用户的新需求；\n",
      "（2）加大市场推广力度，提高产品的知名度和市场占有率；\n",
      "（3）持续优化技术架构，解决技术难题，提高产品的稳定性和性能；\n",
      "（4）培养团队成员的创新能力，不断推出新的功能和特性，提升产品的竞争力。\n",
      "\n",
      "感谢领导和同事们在过去一年中的支持和帮助，我们会继续努力，为公司的长远发展贡献力量。\n",
      "\n",
      "此致\n",
      "敬礼！\n",
      "\n",
      "XXX公司XXX产品经理 XXX\n",
      "XXXX年XX月XX日\n",
      "======\n"
     ]
    }
   ],
   "source": [
    "scene_list = results[1].scene\n",
    "for scene in scene_list:\n",
    "    print(\"预期输出：\",scene['expected_target'])\n",
    "    print(\"评价得分：\", scene['score'])\n",
    "    print(\"模型输出：\", scene['response'])\n",
    "    print(\"======\")\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py311",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "f553a591cb5da27fa30e85168a93942a1a24c8d6748197473adb125e5473a5db"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
